/**
 * Token过期错误检测和处理工具
 * 轻量级工具，不改变现有云函数调用方式
 */
import auth from './auth.js';

// Token过期或用户不存在的错误关键词
const AUTH_ERROR_KEYWORDS = [
  'document.get:fail document with _id',
  'does not exist',
  'token已过期',
  'token无效',
  '用户不存在',
  'unauthorized',
  'authentication failed',
  'invalid token',
  'token expired',
  'user not found',
  'access denied'
];

/**
 * 检查是否为token过期相关错误
 * @param {string} errorMsg 错误信息
 * @returns {boolean} 是否为token过期错误
 */
export function isTokenExpiredError(errorMsg) {
  if (!errorMsg || typeof errorMsg !== 'string') {
    return false;
  }
  
  const lowerMsg = errorMsg.toLowerCase();
  return AUTH_ERROR_KEYWORDS.some(keyword => 
    lowerMsg.includes(keyword.toLowerCase())
  );
}

/**
 * 处理token过期错误
 * @param {Object} options 配置选项
 */
export function handleTokenExpiredError(options = {}) {
  const {
    showModal = true,
    customMessage = '登录已过期，请重新登录'
  } = options;
  
  console.log('🔐 检测到token过期，开始处理...');
  
  // 清除本地登录信息
  try {
    wx.removeStorageSync('access_token');
    wx.removeStorageSync('user_info');
    wx.removeStorageSync('login_type');
    console.log('🔐 已清除本地登录信息');
  } catch (error) {
    console.error('清除登录信息失败:', error);
  }
  
  if (showModal) {
    wx.showModal({
      title: '登录过期',
      content: customMessage,
      showCancel: false,
      confirmText: '重新登录',
      success: (res) => {
        if (res.confirm) {
          // 获取当前页面路径作为登录后的跳转地址
          const pages = getCurrentPages();
          const currentPage = pages[pages.length - 1];
          const redirectUrl = currentPage ? `/${currentPage.route}` : '';
          
          auth.navigateToLogin(redirectUrl);
        }
      }
    });
  } else {
    // 不显示弹窗但直接跳转登录
    const pages = getCurrentPages();
    const currentPage = pages[pages.length - 1];
    const redirectUrl = currentPage ? `/${currentPage.route}` : '';
    
    auth.navigateToLogin(redirectUrl);
  }
}

/**
 * 在云函数调用结果中检查token过期错误
 * @param {Object} result 云函数调用结果
 * @param {Object} options 配置选项
 * @returns {boolean} 是否检测到并处理了token过期错误
 */
export function checkAndHandleAuthError(result, options = {}) {
  // 检查云函数调用结果中的错误
  if (result && result.result && result.result.error) {
    if (isTokenExpiredError(result.result.error)) {
      handleTokenExpiredError(options);
      return true;
    }
  }
  
  // 检查云函数调用本身的错误
  if (result && result.errMsg && !result.errMsg.includes(':ok')) {
    if (isTokenExpiredError(result.errMsg)) {
      handleTokenExpiredError(options);
      return true;
    }
  }
  
  return false;
}

export default {
  isTokenExpiredError,
  handleTokenExpiredError,
  checkAndHandleAuthError
};
